#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

const int INF = INT_MAX;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

int H, W;
int A, B, C, D;
vector<string> grid(1000);

void input()
{
    cin >> H >> W;
    for (int i = 0; i < H; ++i)
    {
        cin >> grid[i];
    }
    cin >> A >> B >> C >> D;
    A--, B--, C--, D--;
}

void bfs()
{
    vector<vector<int>> dist(H, vector<int>(W, INF));
    dist[C][D] = 0;
    deque<pair<int, int>> q; // 使用双端队列，直走的放左边，破壁的放右边
    q.push_front({C, D});
    while (!q.empty())
    {
        auto [i, j] = q.front();
        q.pop_front();
        if (i == A && j == B)
        {
            cout << dist[i][j] << endl;
            return;
        }

        // 可以直接走过去
        for (int k = 0; k < 4; ++k) // 四个方向
        {
            int ni = i + dx[k], nj = j + dy[k];
            if (ni >= 0 && ni < H && nj >= 0 && nj < W ) // 可以走
            {
                if ( grid[ni][nj] == '.' and dist[ni][nj] > dist[i][j]) // 距离更近
                {
                    dist[ni][nj] = dist[i][j];
                    q.push_front({ni, nj});
                }
            }
        }
        // 破壁过去
        for (int k = 0; k < 4; ++k) // 四个方向
        {
            for (int s = 1; s <= 2; ++s) // 最多两步
            {
                int ni = i + dx[k] * s;
                int nj = j + dy[k] * s;
                if (ni >= 0 && ni < H && nj >= 0 && nj < W) // 在地图内
                {
                    if (grid[ni][nj] == '#' || dist[ni][nj] > dist[i][j] + 1) // 可以破壁过去
                    {
                        if (dist[ni][nj] > dist[i][j] + 1)
                        {
                            dist[ni][nj] = dist[i][j] + 1;
                            q.push_back({ni, nj});
                        }
                    }
                }
            }
        }
    }

    cout << -1 << endl;
}
int main()
{

    input();
    bfs();
    return 0;
}